package org.vaadin.chatbox.client; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.regexp.shared.MatchResult; import com.google.gwt.regexp.shared.RegExp; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.InlineLabel; import com.google.gwt.user.client.ui.Widget; public class ChatWidgetLine extends FlowPanel { private static final RegExp ITEM_RE = RegExp.compile( "{{([^:}]*):([^:}]*):([^:}]*)}}", "g"); private static final RegExp URL_RE = RegExp.compile( "(\\b(?:http(?:s)?://|www\\.[^ .]+\\.)[^ ]+)", "g"); private final ChatBoxWidget parent; private boolean clickableUsers = true; public ChatWidgetLine(ChatLine line, ChatBoxWidget parent) { this.parent = parent; if (line.getUser() != null) { add(createUserLabel(line.getUser())); add(createLabel(": ", null)); } String style = (line.getUser()==null) ? "infotext" : "chattext"; create(line.getText(), style); } private void create(String text, String textStyle) { int start = 0; MatchResult r = ITEM_RE.exec(text); while (r != null) { String part = text.substring(start, r.getIndex()); addText(part, textStyle); add(createItemLabel(r)); start = ITEM_RE.getLastIndex(); r = ITEM_RE.exec(text); } addText(text.substring(start), textStyle); } private void addText(String text, String style) { int start = 0; MatchResult r = URL_RE.exec(text); while (r != null) { String part = text.substring(start, r.getIndex()); add(createLabel(part, style)); add(createUrlLabel(r)); start = URL_RE.getLastIndex(); r = URL_RE.exec(text); } add(createLabel(text.substring(start), style)); } private InlineLabel createItemLabel(MatchResult r) { String value = r.getGroup(1).replace("%58", ":") .replace("%123", "{").replace("%125", "}"); String style = r.getGroup(2); String itemId = r.getGroup(3); return createLabel(value, style, itemId); } private Widget createUrlLabel(MatchResult r) { String href = r.getGroup(1); if (href.startsWith("www")) { href = "http://"+href; } Anchor a = new Anchor(r.getGroup(1), href, "_blank"); return a; } private InlineLabel createLabel(String text, String style, final String itemId) { InlineLabel label = new InlineLabel(text); if (!style.isEmpty()) { label.setStylePrimaryName(style); } if (!itemId.isEmpty()) { label.addClickHandler(new ClickHandler() { // @Override public void onClick(ClickEvent event) { parent.clicked(itemId); } }); } return label; } private static InlineLabel createLabel(String text, String style) { InlineLabel label = new InlineLabel(text); if (style != null) { label.setStylePrimaryName(style); } return label; } private InlineLabel createUserLabel(final ChatUser user) { InlineLabel label = new InlineLabel(user.getName()); label.setStylePrimaryName(user.getStyle()); if (clickableUsers) { label.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { parent.clickedUser(user.getId()); } }); } return label; } }